package com.cipher;

public class VigenereCipher {


    public static void main(String[] args) {
        String text = "HELLO VIGENERE";
        String key = "KEY";

        // 加密
        String encryptedText = encrypt(text, key);
        System.out.println("加密后的文本: " + encryptedText);

        // 解密
        String decryptedText = decrypt(encryptedText, key);
        System.out.println("解密后的文本: " + decryptedText);

        // 暴力破解
        //bruteForce(encryptedText);
    }

    // 加密方法
    public static String encrypt(String text, String key) {
        StringBuilder encryptedText = new StringBuilder();
        text = text.toUpperCase();
        key = key.toUpperCase();
        
        for (int i = 0, j = 0; i < text.length(); i++) {
            char letter = text.charAt(i);
            // 检查是否为字母
            if (letter >= 'A' && letter <= 'Z') {
                // 加密公式： (text + key) % 26
                encryptedText.append((char) ((letter + key.charAt(j) - 2 * 'A') % 26 + 'A'));
                j = (j + 1) % key.length(); // 循环使用key
            } else {
                encryptedText.append(letter); // 保留非字母字符
            }
        }
        return encryptedText.toString();
    }

    // 解密方法
    public static String decrypt(String text, String key) {
        StringBuilder decryptedText = new StringBuilder();
        text = text.toUpperCase();
        key = key.toUpperCase();
        
        for (int i = 0, j = 0; i < text.length(); i++) {
            char letter = text.charAt(i);
            // 检查是否为字母
            if (letter >= 'A' && letter <= 'Z') {
                // 解密公式： (text - key + 26) % 26
                decryptedText.append((char) ((letter - key.charAt(j) + 26) % 26 + 'A'));
                j = (j + 1) % key.length(); // 循环使用key
            } else {
                decryptedText.append(letter); // 保留非字母字符
            }
        }
        return decryptedText.toString();
    }



}
